import Vue from 'vue'
import axios from 'axios'
import store from '@/store'
import { VueAxios } from './axios'
import router from '@/router/index'
import { ACCESS_TOKEN, TENANT_ID } from '@/store/mutation-types'
import { Modal } from 'ant-design-vue'
import { login } from '@/utils/login'
/**
 * 【指定 axios的 baseURL】
 * 如果手工指定 baseURL: '/jeecg-boot'
 * 则映射后端域名，通过 vue.config.js
 * @type {*|string}
 */
let prefix = localStorage.getItem('pro__CURRENT_PREFIX')
if (prefix) {
  prefix = JSON.parse(prefix).value || ''
} else {
  prefix = ''
}
// let apiBaseUrl = process.env.VUE_APP_API_BASE_URL
// let apiBaseUrl = 'http://192.168.8.40:18399/serve'
// let apiBaseUrl = 'http://192.168.8.79:8599/serve'
// let apiBaseUrl = 'https://192.168.1.137:60001/serve'
let apiBaseUrl = 'http://192.168.8.72:9590/serve'
// let apiBaseUrl = 'http://192.168.2.42:8399/serve' //李杰18255451708
let apiBaseUrlUpload = apiBaseUrl + prefix + '/sys/common/upload2'
let apiBaseUrlDownload = apiBaseUrl + '/jksaas-mgt/mgt' + '/'
export const fileBaseUrl = apiBaseUrl
//console.log("apiBaseUrl= ",apiBaseUrl)
// 创建 axios 实例

let apiBaseUrlPrefix = apiBaseUrl + prefix
let service = axios.create({
  //baseURL: '/jeecg-boot',
  // baseURL: apiBaseUrlPrefix, // api base_url
  timeout: 9000, // 请求超时时间
})

const err = (error) => {
  if (error.response) {
    let data = error.response.data
    const token = Vue.ls.get(ACCESS_TOKEN)
    console.log('------异常响应------', token)
    console.log('------异常响应------', error.response.status)
    if (error.response.status == 200) {
      console.log('code为 200 ')
    } else {
      if (error.response.status == 404) {
        // let prefix1 = localStorage.getItem('pro__CURRENT_PREFIX')
        // if (prefix1) {
        //   prefix1 = JSON.parse(prefix1).value || ''
        // } else {
        //   prefix1 = ''
        // }
        // apiBaseUrlPrefix = apiBaseUrl + prefix1
        // let config = error.config
        // config.baseURL = apiBaseUrlPrefix
        // service = axios.create({
        //   //baseURL: '/jeecg-boot',
        //   baseURL: apiBaseUrlPrefix, // api base_url
        //   timeout: 9000, // 请求超时时间
        // })
        // // 创建新的Promise
        // var backoff = new Promise(function (resolve) {
        //   setTimeout(function () {
        //     resolve()
        //   }, 1)
        // })
        // // 返回重试请求
        // return backoff.then(function () {
        //   return axios(config)
        // })
      } else if (error.response.data.message.includes('Token失效')) {
        login()
          .then((res) => {
            window.location.reload()
          })
          .catch((e) => {
            if (e && e.rejectType == 'browser') {
              store.dispatch('Logout').then(() => {
                Vue.ls.remove(ACCESS_TOKEN)
                window.location.reload()
              })
            }
          })
      } else {
        Vue.prototype.$Jnotification.error(response.data.message)
      }
    }
    return
    switch (error.response.status) {
      case 403:
        Vue.prototype.$Jnotification.error({ message: '系统提示', description: '拒绝访问', duration: 4 })
        break
      case 500:
        console.log('------error.response------', error.response)
        // update-begin- --- author:liusq ------ date:20200910 ---- for:处理Blob情况----
        let type = error.response.request.responseType
        if (type === 'blob') {
          blobToJson(data)
          break
        }
        // update-end- --- author:liusq ------ date:20200910 ---- for:处理Blob情况----
        if (token && data.message.includes('Token失效')) {
          // update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式，不直接跳转----
          if (/wxwork|dingtalk/i.test(navigator.userAgent)) {
            Vue.prototype.$Jmessage.loading('登录已过期，正在重新登陆', 0)
          } else {
            Vue.prototype.$Jmodal.error({
              title: '登录已过期',
              content: '很抱歉，登录已过期，请重新登录',
              okText: '重新登录',
              mask: false,
              onOk: () => {
                store.dispatch('Logout').then(() => {
                  Vue.ls.remove(ACCESS_TOKEN)
                  try {
                    let path = window.document.location.pathname
                    console.log('location pathname -> ' + path)
                    if (path != '/' && path.indexOf('/user/login') == -1) {
                      window.location.reload()
                    }
                  } catch (e) {
                    window.location.reload()
                  }
                })
              },
            })
          }
          // update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式，不直接跳转----
        }
        break
      case 404:
        Vue.prototype.$Jnotification.error({ message: '系统提示', description: '很抱歉，资源未找到!', duration: 4 })
        break
      case 504:
        Vue.prototype.$Jnotification.error({ message: '系统提示', description: '网络超时' })
        break
      case 401:
        Vue.prototype.$Jnotification.error({ message: '系统提示', description: '未授权，请重新登录', duration: 4 })
        if (token) {
          store.dispatch('Logout').then(() => {
            setTimeout(() => {
              window.location.reload()
            }, 1500)
          })
        }
        break
      default:
        Vue.prototype.$Jnotification.error({
          message: '系统提示',
          description: data.message,
          duration: 4,
        })
        break
    }
  } else if (error.message) {
    if (error.message.includes('timeout')) {
      Vue.prototype.$Jnotification.error({ message: '系统提示', description: '网络超时' })
    } else {
      Vue.prototype.$Jnotification.error({ message: '系统提示', description: error.message })
    }
  }
  return Promise.reject(error)
}

// request interceptor
service.interceptors.request.use(
  (config) => {
    let prefix = store.state.user.currentPrefix || '/jksaas-mgt/mgt'
    let slash = config.url.charAt(0) == '/'
    config.url = apiBaseUrl + prefix + `${slash ? config.url : '/' + config.url}`
    const token = Vue.ls.get(ACCESS_TOKEN)
    if (token) {
      config.headers['X-Access-Token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
    }

    // update-begin--author:sunjianlei---date:20200723---for 如果当前在low-app环境，并且携带了appId，就向Header里传递appId
    const $route = router.currentRoute
    if ($route && $route.name && $route.name.startsWith('low-app') && $route.params.appId) {
      config.headers['X-Low-App-ID'] = $route.params.appId
    }
    // update-end--author:sunjianlei---date:20200723---for 如果当前在low-app环境，并且携带了appId，就向Header里传递appId

    //update-begin-author:taoyan date:2020707 for:多租户
    let tenantid = Vue.ls.get(TENANT_ID)
    if (!tenantid) {
      tenantid = 0
    }
    config.headers['tenant-id'] = tenantid
    //update-end-author:taoyan date:2020707 for:多租户
    if (config.method == 'get') {
      if (config.url.indexOf('sys/dict/getDictItems') < 0) {
        config.params = {
          _t: Date.parse(new Date()) / 1000,
          ...config.params,
        }
      }
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use((response) => {
  // 应用没授权，跳转到上传授权证书页面
  if (response.data.code == 999) {
    // Vue.prototype.$Jnotification.error({
    //   message: '系统提示',
    //   description: response.data.message,
    //   duration: 4,
    // })
    console.log(router)
    router.push({
      path: '/uploadLicense',
    })
  }
  return response.data
}, err)

const installer = {
  vm: {},
  install(Vue, router = {}) {
    Vue.use(VueAxios, router, service)
  },
}
/**
 * Blob解析
 * @param data
 */
function blobToJson(data) {
  let fileReader = new FileReader()
  let token = Vue.ls.get(ACCESS_TOKEN)
  fileReader.onload = function () {
    try {
      let jsonData = JSON.parse(this.result) // 说明是普通对象数据，后台转换失败
      console.log('jsonData', jsonData)
      if (jsonData.status === 500) {
        console.log('token----------》', token)
        if (token && jsonData.message.includes('Token失效')) {
          Modal.error({
            title: '登录已过期',
            content: '很抱歉，登录已过期，请重新登录',
            okText: '重新登录',
            mask: false,
            onOk: () => {
              store.dispatch('Logout').then(() => {
                Vue.ls.remove(ACCESS_TOKEN)
                window.location.reload()
              })
            },
          })
        }
      }
    } catch (err) {
      // 解析成对象失败，说明是正常的文件流
      console.log('blob解析fileReader返回err', err)
    }
  }
  fileReader.readAsText(data)
}

export { installer as VueAxios, service as axios, service, apiBaseUrl, apiBaseUrlUpload, apiBaseUrlDownload }
